import 'package:flutter/material.dart';


class PaginatedDataTablePage extends StatefulWidget {
  PaginatedDataTablePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _PaginatedDataTablePageState createState() => _PaginatedDataTablePageState();
}

class _PaginatedDataTablePageState extends State<PaginatedDataTablePage> {
  int _rowsPerPage = PaginatedDataTable.defaultRowsPerPage;
  int _sortColumnIndex;
  bool _sortAscending = true;
  final DessertDataSource _dessertsDataSource = new DessertDataSource();

  void _sort<T>(Comparable<T> getField(Dessert d), int columnIndex, bool ascending) {
    _dessertsDataSource._sort<T>(getField, ascending);
    setState(() {
      _sortColumnIndex = columnIndex;
      _sortAscending = ascending;
    });
  }
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(title: const Text('学生成绩表')),
        body: new ListView(
            padding: const EdgeInsets.all(5.0),
            children: <Widget>[
              new PaginatedDataTable(
                  //头部的布局
                  header: const Text(''),
                  //一页多少个item
                  rowsPerPage: _rowsPerPage,
                  //翻页监听事件
                  onRowsPerPageChanged: (int value) { setState(() { _rowsPerPage = value; }); },
                  //指定哪列数据的趋势
                  sortColumnIndex: _sortColumnIndex,
                  //是否对sortColumnIndex指定的列按升序排序
                  sortAscending: _sortAscending,
                  //全选监听
                  onSelectAll: _dessertsDataSource._selectAll,
                  //每一列标题栏
                  columns: <DataColumn>[
                    new DataColumn(
                        //标题栏名称
                        label: const Text('姓名'),
                        //长按提示语
                        tooltip: '学生姓名',
                        //值是否是数字
                        numeric: false,
                        onSort: (int columnIndex, bool ascending) => _sort<String>((Dessert d) => d.name, columnIndex, ascending)
                    ),
                    new DataColumn(
                        label: const Text('语文'),
                        tooltip: '语文成绩',
                        numeric: true,
                        onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.chinese, columnIndex, ascending)
                    ),
                    new DataColumn(
                        label: const Text('数学'),
                        tooltip: '数学成绩',
                        numeric: true,
                        onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.math, columnIndex, ascending)
                    ),
                    new DataColumn(
                        label: const Text('英语'),
                        tooltip: '英语成绩',
                        numeric: true,
                        onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.english, columnIndex, ascending)
                    ),
                    new DataColumn(
                        label: const Text('物理'),
                        tooltip: '物理成绩',
                        numeric: true,
                        onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.physical, columnIndex, ascending)
                    ),
                    new DataColumn(
                        label: const Text('化学'),
                        tooltip: '化学成绩',
                        numeric: true,
                        onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.chemical, columnIndex, ascending)
                    ),
                    new DataColumn(
                        label: const Text('生物'),
                        tooltip: '生物成绩',
                        numeric: true,
                        onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.biological, columnIndex, ascending)
                    ),
                    new DataColumn(
                        label: const Text('体育'),
                        tooltip: '体育成绩',
                        numeric: true,
                        onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.sports, columnIndex, ascending)
                    ),
                  ],
                  source: _dessertsDataSource
              )
            ]
        )
    );
  }
}

class DessertDataSource extends DataTableSource {
  int _selectedCount = 0;
  final List<Dessert> _desserts = <Dessert>[
    new Dessert('张三', 99, 95, 100, 89, 98, 96, 90),
    new Dessert('李四', 95, 97, 99, 95, 96, 94, 90),
    new Dessert('王五', 90, 95, 93, 85, 90, 91, 88),
    new Dessert('赵六', 80, 95, 85, 93, 97, 84, 81),
    new Dessert('孙七', 80, 85, 86, 87, 84, 83, 80),
    new Dessert('周八', 80, 79, 83, 81, 88, 80, 82),
    new Dessert('吴九', 78, 79, 74, 72, 76, 77, 78),
    new Dessert('郑十', 79, 83, 75,74, 76, 77, 72),
    new Dessert('华仔', 80, 80, 80, 80, 80, 80, 80),
    new Dessert('周星', 80, 87, 90, 84, 88, 82, 81),
    new Dessert('龙哥', 86, 90, 79, 85, 87, 88, 89),
    new Dessert('菲姐', 80, 87, 90, 84, 88, 82, 81),
    new Dessert('莉莉', 86, 90, 79, 85, 87, 88, 89),
    new Dessert('杰哥', 79, 83, 75,74, 76, 77, 72),
    new Dessert('小明', 54, 83, 75,74, 76, 77, 72),
    new Dessert('小花', 79, 62, 75,74, 76, 77, 72),
    new Dessert('小哥', 79, 62, 75,71, 76, 77, 72),
    new Dessert('小晨', 79, 62, 53,74, 76, 77, 72),
    new Dessert('晓晓', 79, 62, 75,74, 76, 77, 72),
    new Dessert('小爱', 79, 62, 75,74, 76, 77, 72),
    new Dessert('小冰', 79, 62, 75,74, 76, 77, 72),
    new Dessert('娜娜', 79, 62, 75,74, 76, 77, 72),
    new Dessert('小宝', 79, 62, 75,74, 76, 77, 72),
    new Dessert('笑笑', 79, 62, 75,74, 76, 77, 72),
    new Dessert('慧慧', 79, 62, 75,74, 76, 77, 72),
    new Dessert('窝窝', 79, 62, 75,74, 76, 77, 72),
    new Dessert('德德', 79, 62, 75,74, 76, 77, 72),
    new Dessert('安安', 79, 62, 75,74, 76, 77, 72),
    new Dessert('马德拉', 79, 62, 75,74, 76, 77, 72),
    new Dessert('莫再提', 79, 62, 75,74, 76, 77, 72),
    new Dessert('莫再问', 46, 62, 75,74, 76, 77, 72),
    new Dessert('琪琪', 79, 62, 75,74, 76, 77, 72),
    new Dessert('球球', 79, 62, 75,74, 76, 77, 72),
    new Dessert('妞妞', 79, 62, 75,74, 76, 77, 72),
    new Dessert('桂姐', 79, 62, 75,74, 76, 77, 72),
    new Dessert('思思', 79, 62, 75,74, 76, 77, 72),
    new Dessert('小念', 79, 62, 75,74, 76, 77, 72),
    new Dessert('青青', 79, 62, 75,74, 76, 77, 72),
    new Dessert('悠悠', 79, 62, 75,74, 76, 77, 72),
    new Dessert('油油', 79, 62, 75,74, 76, 77, 72),
    new Dessert('陌陌', 79, 62, 75,74, 76, 77, 72),
    new Dessert('仔仔', 79, 62, 75,74, 76, 77, 72),
    new Dessert('孜孜', 79, 62, 75,74, 76, 77, 72),
    new Dessert('哈哥', 79, 62, 75,74, 76, 77, 72),
    new Dessert('看看', 79, 62, 75,74, 76, 77, 72),
    new Dessert('YY', 79, 62, 75,74, 76, 77, 72),
    new Dessert('依依', 79, 62, 75,74, 76, 77, 72),
    new Dessert('翠翠', 79, 62, 75,74, 76, 77, 72),
    new Dessert('溜溜', 79, 62, 75,74, 76, 77, 72),
    new Dessert('辉辉', 79, 62, 75,74, 76, 77, 72),
  ];

  void _sort<T>(Comparable<T> getField(Dessert d), bool ascending) {
    _desserts.sort((Dessert a, Dessert b) {
      if (!ascending) {
        final Dessert c = a;
        a = b;
        b = c;
      }
      final Comparable<T> aValue = getField(a);
      final Comparable<T> bValue = getField(b);
      return Comparable.compare(aValue, bValue);
    });
    notifyListeners();
  }

  void _selectAll(bool checked) {
    for (Dessert dessert in _desserts) dessert.selected = checked;
    _selectedCount = checked ? _desserts.length : 0;
    notifyListeners();
  }

  @override
  DataRow getRow(int index) {
    assert(index >= 0);
    if (index >= _desserts.length) return null;
    final Dessert dessert = _desserts[index];
    return new DataRow.byIndex(
        index: index,
        selected: dessert.selected,
        onSelectChanged: (bool value) {
          if (dessert.selected != value) {
            _selectedCount += value ? 1 : -1;
            assert(_selectedCount >= 0);
            dessert.selected = value;
            notifyListeners();
          }
        },
        cells: <DataCell>[
          new DataCell(new Text('${dessert.name}')),
          new DataCell(new Text('${dessert.chinese}')),
          new DataCell(new Text('${dessert.math}')),
          new DataCell(new Text('${dessert.english}')),
          new DataCell(new Text('${dessert.physical}')),
          new DataCell(new Text('${dessert.chemical}')),
          new DataCell(new Text('${dessert.biological}')),
          new DataCell(new Text('${dessert.sports}')),
        ]);
  }

  @override
  bool get isRowCountApproximate => false;

  @override
  int get rowCount => _desserts.length;

  @override
  int get selectedRowCount => _selectedCount;
}

class Dessert {
  Dessert(this.name, this.chinese, this.math, this.english, this.physical,
      this.chemical, this.biological, this.sports);

  final String name;
  final int chinese;
  final int math;
  final int english;
  final int physical;
  final int chemical;
  final int biological;
  final int sports;

  bool selected = false;
}